const path = require('path');
const webpack = require('webpack');

const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const postcssPresetEnv = require('postcss-preset-env');

module.exports = {
    // entry: ['./src/index.js', './src/login.js'] // 通过数组可以打包多个入口文件，但输入文件最后会合并为一个
    entry: {
        index: './src/index.js',
        login: './src/login.js'
    }, // 入口文件

    output: {
        filename: '[name].bundle.js', // 打包后的文件名
        path: path.resolve(__dirname, 'dist') // 打包后的目录，只能是绝对路径
    }, // 出口文件

    // 提取公共代码
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {
                    test: /node_modules/, // 指定是 node_modules 下的第三方
                    chunks: 'initial',
                    name: 'vendor', // 抽离后的第三方打包问价名
                    priority: 10, // 设定优先级， 防止与自定义的公共代码提取时被覆盖，而不打包
                }, // 抽离第三方插件
                utils: {
                    test: /utils/,
                    chunks: 'initial',
                    name: 'utils', // 任意命名
                    minSize: 0, // 只要超出 0 个字节就生成一个新包
                }, // 抽离自己写的公共代码，属性名是自定义的
            }
        }
    },

    devtool: 'eval-source-map',

    module: {
        rules: [
            {
                test: /\.js$/,
                include: '/src/',
                exclude: '/node_modules/',
                use: 'babel-loader'
            },
            {
                test: /\.css$/, // 匹配所有 css 文件
                use: [
                    'style-loader',
                    // MiniCssExtractPlugin.loader, // 有了它就不再需要 style-loader
                    'css-loader',
                    {
                        loader: 'postcss-loader',
                        options: {
                            config: {
                                path: './postcss.config.js'
                            }
                        }
                    }
                ], // 从右向左 解析
            },
            {
                test: /\.(jpg|png|svg|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 10240
                        }
                    }
                ]
            }
        ]
    }, // 处理对应模块（文件）

    plugins: [
        //清理打包
        new CleanWebpackPlugin(['dist']),

        // 通过 new 来使用插件
        new HtmlWebpackPlugin({
            //使用自定义的模板
            template: './src/index.html',
            filename: 'index.html',
            hash: true, // 在打包好的 bundle.js 后面加上 hash 串
            chunks: ['vendor', 'utils', 'index'], // 对应关系，index.js 对应 index.html
        }),
        new HtmlWebpackPlugin({
            template: './src/login.html',
            filename: 'login.html',
            hash: true,
            chunks: ['vendor', 'login']
        }),
        
        // 将 css 从 js 中分离出来，使用 link 标签引用
        // new MiniCssExtractPlugin(),

        // 引入热更新插件
        new webpack.HotModuleReplacementPlugin(),
    ], // 要使用的插件

    devServer: {
        contentBase: './dist',
        port: 3000,
        hot: true, // 热更新
    }, // 开发服务器配置

    // mode: 'development', // 模式配置：development、production
}